package kr.or.smardi.smardi_AScan.Graph;

import java.util.*;

import kr.or.smardi.smardi_AScan.*;
import kr.or.smardi.smardi_AScan.Device.*;

import android.content.*;
import android.graphics.*;
import android.provider.SyncStateContract.Constants;
import android.util.*;
import android.view.*;

public class MyView extends View {
	int width = 0;
	int height = 0;
	float minX, maxX, minY, maxY;

	public static final int UNIT_DAY = 1;
	public static final int UNIT_10MIN = 2;

	public Graph graph = null;
	ArrayList<GraphData> graphData;

	Canvas canvas = null;
	
	LookupTable lookupTable = null;
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		this.canvas = canvas;
		
		graph.setSize(width, height);

		graph.drawable_readyToBlow =
			getResources().getDrawable(R.drawable.ready_to_blow); 
		
		graph.makeGraph(canvas, true, false);
	}

	// 여기부터===========================
	// 첫번째로 graphData를 만들고
	// 두번째로 값을 넣고
	// 세번째로 값을 저장함
	/*
	 * public void makeGraphData() { graphData = new ArrayList<GraphData>(); }
	 * 
	 * public void addGraphData(long x, float y) { graphData.add(new
	 * GraphData(x, y)); }
	 * 
	 * public void saveGraphData(int color, String title) {
	 * graph.addDataArray(graphData, color, title); }
	 */
	// 여기까지===========================

	
	//===================================
	
	/**
	 *Boundary를 설정한다. 
	 */
	public void setDataBoundary(long xMin, long xMax, double yMin, double yMax) {
		graph.dataBoundary_left = xMin;
		graph.dataBoundary_right = xMax;
		graph.dataBoundary_top = yMax;
		graph.dataBoundary_bottom = yMin;
	}
	
	
	public void setLookupTable(LookupTable table) {
		
		lookupTable = table;
		graph.setLookupTable(table.getLookupTable());
	}
	
	//데이터를 추가한다.
	public void addGraphData(long x, float y) {
		
		float alcohol_y = 0;
		if(lookupTable != null) {
			alcohol_y = (float) lookupTable.convertVolumeToAlchole(y);
		} else {
			return;
		}
		
		if(alcohol_y > 0.5) {
			alcohol_y = 0.5f;
		}
		
		graph.graphDatas.add(new GraphData(x, alcohol_y));
		invalidate();
	}
	
	
	
	
	// --------------------------------------------------------
	// 생성자
	public MyView(Context context) {
		super(context);
	}

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs, 0);
		Log.w("test", "CustomView(" + context + "," + attrs + ")");

		// 여기로 들어옴
	}

	/*
	 * xml 에서 넘어온 속성을 멤버변수로 셋팅하는 역할을 한다.
	 */
	public MyView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		Log.w("test", "CustomView(" + context + "," + attrs + "," + defStyle
				+ "),text:");
	}

	/*
	 * 넘어오는 파라메터는 부모뷰로부터 결정된 치수제한을 의미한다. 또한 파라메터에는 bit 연산자를 사용해서 모드와 크기를 같이
	 * 담고있다. 모드는 MeasureSpec.getMode(spec) 형태로 얻어오며 다음과 같은 3종류가 있다.
	 * MeasureSpec.AT_MOST : wrap_content (뷰 내부의 크기에 따라 크기가 달라짐)
	 * MeasureSpec.EXACTLY : fill_parent, match_parent (외부에서 이미 크기가 지정되었음)
	 * MeasureSpec.UNSPECIFIED : MODE 가 셋팅되지 않은 크기가 넘어올때 (대부분 이 경우는 없다)
	 * 
	 * fill_parent, match_parent 를 사용하면 윗단에서 이미 크기가 계산되어 EXACTLY 로 넘어온다. 이러한 크기는
	 * MeasureSpec.getSize(spec) 으로 얻어낼 수 있다.
	 * 
	 * 이 메소드에서는 setMeasuredDimension(measuredWidth,measuredHeight) 를 호출해 주어야 하는데
	 * super.onMeasure() 에서는 기본으로 이를 기본으로 계산하는 함수를 포함하고 있다.
	 * 
	 * 만약 xml 에서 크기를 wrap_content 로 설정했다면 이 함수에서 크기를 계산해서 셋팅해 줘야한다. 그렇지 않으면 무조껀
	 * fill_parent 로 나오게 된다.
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

		// height 진짜 크기 구하기
		int heightMode = MeasureSpec.getMode(heightMeasureSpec);
		int heightSize = 0;
		switch (heightMode) {
		case MeasureSpec.UNSPECIFIED: // mode 가 셋팅되지 않은 크기가 넘어올때
			heightSize = heightMeasureSpec;
			break;
		case MeasureSpec.AT_MOST: // wrap_content (뷰 내부의 크기에 따라 크기가 달라짐)
			heightSize = 20;
			break;
		case MeasureSpec.EXACTLY: // fill_parent, match_parent (외부에서 이미 크기가
									// 지정되었음)
			heightSize = MeasureSpec.getSize(heightMeasureSpec);
			break;
		}

		// width 진짜 크기 구하기
		int widthMode = MeasureSpec.getMode(widthMeasureSpec);
		int widthSize = 0;
		switch (widthMode) {
		case MeasureSpec.UNSPECIFIED: // mode 가 셋팅되지 않은 크기가 넘어올때
			widthSize = widthMeasureSpec;
			break;
		case MeasureSpec.AT_MOST: // wrap_content (뷰 내부의 크기에 따라 크기가 달라짐)
			widthSize = 100;
			break;
		case MeasureSpec.EXACTLY: // fill_parent, match_parent (외부에서 이미 크기가
									// 지정되었음)
			widthSize = MeasureSpec.getSize(widthMeasureSpec);
			break;
		}

		Log.w("test", "onMeasure(" + widthMeasureSpec + "," + heightMeasureSpec
				+ ")");

		setMeasuredDimension(widthSize, heightSize);

		width = widthSize;
		height = heightSize;

		if(graph == null) {
			graph = new Graph(0, 0, width, height, 0, width, 0, height);
		} else {
			graph.setSize(width, height);
		}

	}

	public void setXUnit(int unit) {
		graph.unitType = unit;
	}
	
}
